package com.qianfeng.ssmplatform.strategy.service.impl;


//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼                  BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  


import com.qianfeng.smsplatform.common.constants.CacheConstants;
import com.qianfeng.smsplatform.common.constants.StrategyConstants;
import com.qianfeng.smsplatform.common.model.Standard_Submit;
import com.qianfeng.ssmplatform.strategy.exception.DataProcessException;
import com.qianfeng.ssmplatform.strategy.service.FilterChain;
import com.qianfeng.ssmplatform.strategy.service.IQueueService;
import com.qianfeng.ssmplatform.strategy.service.api.CacheService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * Created by jackiechan on 2020-02-27 11:07
 *
 * @Author jackiechan
 */
@Service
public class SmsFeeFilter implements FilterChain {
    @Autowired
    private CacheService cacheService;
    private static final Logger LOGGER = LoggerFactory.getLogger(SmsFeeFilter.class);
    @Autowired
    private IQueueService queueService;

    @Override
    public boolean dealSms(Standard_Submit submit) throws DataProcessException {

        //首先获取用户还剩多少钱
        //String fee = cacheService.get(CacheConstants.CACHE_PREFIX_CUSTOMER_FEE + submit.getClientID());
        Object fee = cacheService.getObject(CacheConstants.CACHE_PREFIX_CUSTOMER_FEE + submit.getClientID());
        LOGGER.error("用户当前剩余:{}", fee);
        if (fee==null) {
            //TODO 从数据库中获取然后保存到 redis
        }else{
            int feeint = (int) fee;//转成数字
            Map routerMap = cacheService.hGetAll(CacheConstants.CACHE_PREFIX_ROUTER + submit.getClientID());
            if (routerMap == null) {
                //TODO 根据防穿透原则去检查数据源

            }else{
                Integer price = (Integer) routerMap.get("price");//获取每一条短信的价格
                //判断
                if (feeint >= price) {
                    //扣费并放行,后面需要注意,如果移动的网关告诉我们短信发送失败的话,我们还需要把用户的钱加回来,所以我们需要保存扣费记录
                    cacheService.decr(CacheConstants.CACHE_PREFIX_CUSTOMER_FEE + submit.getClientID(), price);
                    //补全数据
                    submit.setGatewayID((Integer) routerMap.get("channelid"));//补全网关 id 也就是我们发送 mq 到网关的时候是发送到这个 id 对应的队列
                    submit.setSrcNumber((String) routerMap.get("extendnumber"));//补全扩展号,也就是 106995xxxxxx 后面这段
                    //放行
                    LOGGER.error("发送完成后还剩余:{}",feeint-price);
                    //TODO 实际上扣费完成要给用户同步回数据库,什么时候同步?我们可以选择每发一条短信,给用户同步一次, 可以使用 mq 将消息发到计费系统,慢慢同步到数据库
                    //TODO 我们可以每隔一段时间进行一次计费统计,然后统一更新到数据库,这样子准确性会有偏差,有偏差不代表不行,这个属于我们的业务要求,我们可能会允许一定的偏差,比如阿里云的计费应该是十分钟还是多少时间计算一次
                    return true;
                }else{
                    //queueService.sendSubmitToMQ(submit, StrategyConstants.STRATEGY_ERROR_FEE);
                    queueService.sendSmsReport(submit, StrategyConstants.STRATEGY_ERROR_FEE);
                }
            }
        }

        //判断每条短信需要多少钱


        return false;
    }
}
